#pragma once

#include <cstdint>
#include <string>
#include <vector>

namespace mini_redis {

struct SkiplistNode
{
    double      score;     // 排序分数
    std::string member;    //存储实际的元素值

    std::vector<SkiplistNode*> forward;    //层级指针数组
#if 0
    数组中的每个元素是一个指针，指向 “同一层级” 中下一个节点（例如 forward[0]
指向第 0 层的下一个节点，forward[1] 指向第 1 层的下一个节点）。
    不同层级的指针形成了 “多层索引”，使得跳表可以像 “多级台阶”
一样快速跳过无关节点，实现 O (logn)级别的查询、插入、删除效率（类似平衡树，但实现更简单）。
#endif

    SkiplistNode(int level, double sc, const std::string& mem)
        : score(sc)
        , member(mem)
        , forward(static_cast<size_t>(level), nullptr)
    {
    }
};

class Skiplist
{
public:
    Skiplist();
    ~Skiplist();
    bool insert(double score, const std::string& member);
    bool erase(double score, const std::string& member);
    void rangeByRank(int64_t start, int64_t stop,
                     std::vector<std::string>& out) const;
    void toVector(std::vector<std::pair<double, std::string>>& out) const;
    size_t size() const
    {
        return length_;
    }

private:
    int randomLevel();

private:
    static constexpr int    kMaxLevel    = 32;
    static constexpr double kProbability = 0.25;

    SkiplistNode* head_;
    int           level_;
    size_t        length_;
};
}    // namespace mini_redis